﻿// MATRIX.h : 定义了一个矩阵类，用于矩阵计算器。
//

#include <iostream>
#include <vector>
#include <stdexcept>

#ifndef MATRIX
#define MATRIX

class Matrix
{
public:
	void setMatrix(const int amr,const int amc,const int cod)
	{
		int func = 0;
		auto ele = 0;
		code = cod;
		try
		{
			ar = amr;
			ac = amc;
			if (ar < 1 || ac < 1 || ar > 1000 || ac > 1000 || ar < -1000 || ac < -1000 )
			{
				throw std::invalid_argument("非正参数");
			}
		}
		catch (std::invalid_argument& e)//新应用：更好的错误处理
		{
			std::cerr << "错误："<< e.what();
			return;
		}
		matrix.resize(ar, std::vector<int>(ac));//新应用：重新初始化
		std::cout << "正在定义编号为" << code << "的矩阵\n";
		std::cout << "功能菜单：；\n1.输入1000来快速创造零矩阵；2.输入1111来快速创造单位矩阵（默认以行数作为方阵大小）；\n";
		std::cout << "请选择功能\n";
		std::cin >> func;
		switch (func)//预留的快捷功能接口
		{
		case 1000:
		{
			ele = 0;
			for (int i = 0; i < amr; i++)
			{
				for (int j = 0; j < amc; j++)
				{
					matrix[i][j] = ele;
				}
			}
			return;
		}
		case 1111:
		{
			ele = 1;
			matrix.resize(ar, std::vector<int>(ar));
			for (int i = 0; i < amr; i++)
			{
				for (int j = 0; j < amr; j++)
				{
					if (i == j)
					{
						matrix[i][j] = ele;
					}
				}
			}
			return;
		}
		default:
		{
			std::cout << "任何时候输入9999以取消定义";
			;//无事发生
		}
		}
		for (int i = 0; i < amr; i++)
		{
			for (int j = 0; j < amc; j++)
			{
				std::cout << "请输入第" << i + 1 << "行第" << j + 1 << "列的元素 ";
				std::cin >> ele;
				if (ele == 9999)
				{
					std::cout << "已取消定义该矩阵。\n";
					matrix.clear();//
					definee = 0;
					//matrix[0][0] = 9999;导致未定义行为
					return;
				}
				matrix[i][j] = ele;
			}
		}
	}

	void getMatrix()
	{
		if (definee == 0)
		{
			std::cout << "该矩阵已被取消定义.请重新定义该矩阵.";
			return;
		}
		std::cout << "\n编号为" << code << "的矩阵准备就绪：\n";
		for (const auto& it1 : matrix)//新应用：遍历的新模式
		{
			for (const auto& it2 : it1)
			{
				std::cout << it2 << '\t';
			}
			std::cout << '\n';
		}
	}


private:
	int ar;//行数
	int ac;//列数
	std::vector<std::vector<int>> matrix;//{ ar,std::vector<int>(ac) };//矩阵主体;新知识：恼人的定义解决方式
	std::vector<std::vector<int>>* ptrmat = &matrix;//备用指针
	int code;//矩阵代码
	bool definee = 1;
};

#endif // !MATRIX

//笔记：1.向量（特别是二维向量）的初始化，再度初始化（resize）；
//		2.ifndef的使用（防重定义）；
//		3.遍历数组的新方法；
//		4.恼人的定义及其解决方法；
//		5.try-catch;

